# 代码 2-39
import numpy as np  #导入NumPy库
arr = np.arange(100).reshape(10,10)  #创建一个数组
np.save("./tmp/save_arr",arr)  #np.save保存数组
print('保存的数组为：\n',arr)

# 代码 2-40
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.arange(0,1.0,0.1)
np.savez('./tmp/savez_arr',arr1,arr2)    #np.savez保存多维数组
print('保存的数组1为：',arr1)
print('保存的数组2为：',arr2)

# 代码 2-41
loaded_data = np.load("./tmp/save_arr.npy")  #读取含有单个数组的文件
print('读取的数组为：\n',loaded_data)

loaded_data1 = np.load("./tmp/savez_arr.npz")  #读取含有多个数组的文件
print('读取的数组1为：',loaded_data1['arr_0'])
print('读取的数组2为：',loaded_data1['arr_1'])

# 代码 2-42
arr = np.arange(0,12,0.5).reshape(4,-1) #四行
print('创建的数组为：',arr)

#fmt ="%d"为指定保存为整数
np.savetxt("./tmp/arr.txt", arr, fmt="%d", delimiter=",") #%d为整数
#读入的时候也需要指定逗号分隔
loaded_data = np.loadtxt("./tmp/arr.txt",delimiter=",")
print('读取的数组为：',loaded_data)

# 代码 2-44
np.random.seed(42)  #设置随机种子
arr = np.random.randint(1,10,size = 10)  #生成随机数
print('创建的数组为：',arr)

arr.sort()  #直接排序
print('排序后数组为：',arr)

arr = np.random.randint(1,10,size = (3,3))  #生成3行3列的随机数
print('创建的数组为：',arr)

arr.sort(axis = 1)  #沿着横轴排序
print('排序后数组为：',arr)

arr.sort(axis = 0)  #沿着纵轴排序
print('排序后数组为：',arr)

# 代码 2-45
arr = np.array([2,3,6,8,0,7])
print('创建的数组为：',arr)
print('排序后数组为：',arr.argsort())  #返回值为重新排序值的下标

# 代码 2-46
a = np.array([3,2,6,4,5])
b = np.array([50,30,40,20,10])
c = np.array([400,300,600,100,200])
d = np.lexsort((a,b,c))  #lexsort函数只接受一个参数，即（a,b,c）多个键值排序是按照最后一个传入数据计算的
print('排序后数组为：',list(zip(a[d],b[d],c[d])))  #按列排序

# 代码 2-47
names = np.array(['小明', '小黄', '小花', '小明', '小花', '小兰', '小白'])
print('创建的数组为：',names)

print('去重后的数组为：',np.unique(names))

ints = np.array([1,2,3,4,4,5,6,6,7,8,8,9,10])  #创建数值型数据
print('创建的数组为：',ints)
print('去重后的数组为：',np.unique(ints))

# 代码 2-48
arr = np.arange(5)
print('创建的数组为：',arr)
print('重复后数组为：',np.tile(arr,3))  #对数组进行重复

# 代码 2-49
np.random.seed(42)  #设置随机种子
arr = np.random.randint(0,10,size = (3,3))
print('创建的数组为：',arr)
print('重复后数组为：',np.repeat(arr,2, axis = 0))  #按行进行元素重复
print('重复后数组为：',arr.repeat(2, axis = 1))  #按列进行元素重复

# 代码 2-50
arr = np.arange(20).reshape(4,5)
print('2-50创建的数组为：',arr)
print('数组的和为：',np.sum(arr))  #计算数组的和
print('数组横轴的和为：',arr.sum(axis = 0))  #沿着横轴计算求和
print('数组纵轴的和为：',arr.sum(axis = 1))  #沿着纵轴计算求和
print('数组的均值为：',np.mean(arr))  #计算数组均值
print('数组横轴的均值为：',arr.mean(axis = 0))  #沿着横轴计算数组均值
print('数组纵轴的均值为：',arr.mean(axis = 1))  #沿着纵轴计算数组均值
print('数组的标准差为：',np.std(arr))  #计算数组标准差
print('数组的方差为：',np.var(arr))  #计算数组方差
print('数组的最小值为：',np.min(arr))  #计算数组最小值
print('数组的最大值为：',np.max(arr))  #计算数组最大值
print('数组的最小元素为：',np.argmin(arr))  #返回数组最小元素的索引
print('数组的最大元素为：',np.argmax(arr))  #返回数组最大元素的索引

# 代码 2-51
arr = np.arange(2,10)
print('创建的数组为：',arr)
print('数组元素的累计和为：',np.cumsum(arr))  #计算所有元素的累计和
print('数组元素的累计积为：',np.cumprod(arr))  #计算所有元素的累计积

